package com.binc.testspring.study.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Objects;

/**
 * FileName: JDKProxy   实验一下jdk的动态代理
 * Autho: binC
 * Date:  2022/3/11 11:00
 */
public class JDKProxy {

    public static void main(String[] args) {
        //测试动态代理
        HelloWorld hw = new HelloWorld(); //被代理的类
        InvocationHandler invocationHandler = new HelloProxy(hw);  //代理类对象
        HelloInterface helloInterface = (HelloInterface) Proxy.newProxyInstance(
                invocationHandler.getClass().getClassLoader(),//代理对象的类加载器
                hw.getClass().getInterfaces(), //被代理类的接口
                invocationHandler);  //代理对象
        helloInterface.sayHello();

    }

}

// 定义一个接口
interface HelloInterface{
    void sayHello();
}

// 接口的实现类 --  被代理的对象
class HelloWorld implements  HelloInterface{
    @Override
    public void sayHello() {
        System.out.println("hello World!");
    }
}

// 动态代理类  -- 这一个类可以代理所有接口
class HelloProxy implements InvocationHandler{
    private Object obj; //被代理对象

    public HelloProxy(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("执行 HelloProxy.invoke 前："+method.getName());
        method.invoke(obj,args); //执行 被代理对象的方法；
        System.out.println("执行 HelloProxy.invoke 前："+method.getName());
        return null;
    }
}